#include <iostream>

using namespace std;

// 多态条件
// 1、调用函数是重写的虚函数
// 2、基类指针或者引用

//class Person {
//public:
//	virtual	void BuyTicket() const { 
//		cout << "买票-全价" << endl;
//	}
//};
//
//class Student : public Person {
//public:
//	//建议写上virtual
//	 virtual void BuyTicket() const { 
//		cout << "买票-半价" << endl;
//	}
//};
//
//void func(const Person& p)
//{
//	p.BuyTicket();
//}
//
//int main()
//{
//	func(Person());
//
//	func(Student());
//
//	return 0;
//}

//class A 
//{};
//
//class B : public A 
//{};
//
//class Person {
//public:
//	virtual A* f() 
//	{ 
//		return new A; 
//	}
//};
//class Student : public Person {
//public:
//	virtual B* f() 
//	{
//		return new B; 
//	}
//};

//class Person {
//public:
//	virtual ~Person() 
//	{
//		cout << "~Person()" << endl; 
//	}
//};
//class Student : public Person {
//public:
//	//建议派生类也写上virtual
//	virtual ~Student() 
//	{
//		cout << "~Student()" << endl; 
//	}
//};
//
//int main()
//{
//	Person* p = new Person;
//	delete p;
//
//	p = new Student;
//	delete p;
//
//	return 0;
//}

//class Person {
//public:
//	virtual ~Person  () final
//	{
//		cout << "~Person()" << endl; 
//	}
//};
//class Student : public Person {
//public:
//	virtual ~Student() 
//	{
//		cout << "~Student()" << endl; 
//	}
//};

//class Car {
//public:
//	void Drive() {}
//};
//class Benz :public Car {
//public:
//	virtual void Drive() override 
//	{
//		cout << "BYD-舒适" << endl; 
//	}
//};


//final修饰的类不能被继承
//class A final
//{};
//
//class B : public A
//{};
//
//int main()
//{
//	return 0;
//}

//class A
//{
//public:
//	static A GetInst()
//	{
//		return A();
//	}
//private:
//	A()
//	{}
//};
//
//class B : public A
//{};
//
//int main()
//{
//	A a = A::GetInst();
//	B bb;
//	return 0;
//}


////sizeof(Base)是多少？
//class Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Func1()" << endl;
//	}
//private:
//	char _b = 1;
//};
//	
//int main()
//{
//	cout << sizeof(Base) << endl;
//	
//	Base b1;
//	
//	return 0;
//}


//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//
//	int _a = 1;
//};
//
//class Student : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-半价" << endl; }
//	int _b = 1;
//};
//
//void Func(Person p)
//{
//	// 不符合多态，编译时确认函数地址
//	p.BuyTicket();
//}
//
//int main()
//{
//	Person Mike;
//	Func(Mike);
//
//	Student Johnson;
//	Func(Johnson);
//
//	return 0;
//}

//输出结果什么呢？
//class A
//{
//public:
//    virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//    virtual void test(){func();}
//};
//
//class B : public A
//{
//public:
//    void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//
//};
//
//int main(int argc, char* argv[])
//{
//    B* p = new B;
//    p->test();
//    return 0;
//}

class Person {
public:
	virtual void BuyTicket() { cout << "买票-全价" << endl; }

	virtual void Func1() 
	{
		cout << "Person::Func1()" << endl;
	}

	virtual void Func2() 
	{
		cout << "Person::Func2()" << endl;
	}

//protected:
	int _a = 0;
};

class Student : public Person {
public:
	virtual void BuyTicket() { cout << "买票-半价" << endl; }

private:
protected:
	int _b = 1;
};



//int main()
//{
//	Person mike;
//	Student jack;
//
//	mike = jack;
//
//	return 0;
//}

int main()
{
	Person ps;
	Student st;

	int a = 0;
	printf("栈：%p\n", &a);

	static int b = 0;
	printf("静态区：%p\n", &b);

	int* p = new int;
	printf("堆：%p\n", p);

	const char* str = "hello world";
	printf("常量区：%p\n", str);

	
	printf("虚表1：0x%llx\n", *((long long int*)&ps));
	printf("虚表2：0x%llx\n", *((long long int*)&st));


	return 0;
}